package com.example.spring_cloud_ribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * 在应用主类中，通过@EnableDiscoveryClient注解来添加发现服务能力。<br>
 * 使用@EnableCircuitBreaker注解开启断路器功能。
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class RibbonApplication {
	/**
	 * 创建RestTemplate实例，并通过@LoadBalanced注解开启均衡负载能力。
	 */
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

	/**
	 * Ribbon是一个基于HTTP和TCP客户端的负载均衡器。<br>
	 * Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。<br>
	 * 当Ribbon与Eureka联合使用时，ribbonServerList会被DiscoveryEnabledNIWSServerList重写，
	 * 扩展成从Eureka注册中心中获取服务端列表。<br>
	 * 同时它也会用NIWSDiscoveryPing来取代IPing，它将职责委托给Eureka来确定服务端是否已经启动。<br>
	 * 使用Ribbon来调用服务，并实现客户端的均衡负载。
	 */
	public static void main(String[] args) {
		SpringApplication.run(RibbonApplication.class, args);
	}
}
